package com.healer.aspect;

import com.healer.common.IDUtil;
import com.healer.controller.SystemLogController;
import com.healer.service.SystemLogService;
import org.aspectj.lang.JoinPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static com.healer.common.StringUtil.getBrowserSystemInfo;

@Component
public class SystemLogAspect {
//    在注入的过程中才能实现bean的注入
    @Autowired(required = false)//有就注入，没有就报错
    private HttpServletRequest httpServletRequest;

    @Autowired
    private SystemLogService systemLogService;
//    访问的时间
    private Date accessDate;
//    日志信息map
    Map<String,Object> map=new HashMap<>();
//访问类
    private Class aClass;
    /**
     * 前置通知
     * @param jp
     */
    public void doBefore(JoinPoint jp){
        aClass=jp.getTarget().getClass();
        if(aClass!= SystemLogController.class){
//            日志ID
            map.put("logId", IDUtil.getUUID());
//            请求的URL
            String url=httpServletRequest.getRequestURL().toString();
            map.put("accessInterface",url);
//            请求IP
            String ip=httpServletRequest.getRemoteAddr();
            map.put("accessIp",ip);
//            请求方式
            String method=httpServletRequest.getMethod();
            map.put("requestType",method);
//            访问的时间
            accessDate =new Date();
            map.put("accessDate",accessDate);
//            请求参数
            String args= Arrays.toString(jp.getArgs());
            map.put("interfaceParams",args);
//            访问的浏览器信息
            String browserSystemInfo=getBrowserSystemInfo(httpServletRequest);
            map.put("accessSource",browserSystemInfo);

        }
    }

    /**
     * 后置通知
     * @param jp
     */
    public void doAfter(JoinPoint jp){
        if(aClass!= SystemLogController.class){
            long executeTime =new Date().getTime()-accessDate.getTime();
//            执行时长
            map.put("executeTime",executeTime);
            map.forEach((k,v)-> System.out.println(k+": "+v));
            systemLogService.saveLog(map);
        }
    }
}

